home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_03 / select.c < prev    next >
C/C++ Source or Header  |  1988-12-02  |  5KB  |  199 lines

  1.  
  2. /* select.c : 11/27/88, d.c.oshel */
  3.  
  4. #include "burlap.h"
  5.  
  6. #define XCRD 6
  7. #define YCRD 18
  8.  
  9. int select_flag = SKIP_FORM;
  10.  
  11. /* this exhibits the underlying relationships between a form and the
  12.    actual storage location(s) of the data collected into the form; 
  13.    
  14.    NOTE, in this case we DO NOT use Allocate_Fields, because the storage
  15.    locations are NOT dynamic(!); also, while fields are NOT null-terminated
  16.    ASCIZ strings, the macro_buffer as a whole IS.
  17.    */
  18.  
  19. char macro_buffer[] =  /* four 64-char lines will be edited as one buffer */
  20.   "                                                                "
  21.   "                                                                "
  22.   "                                                                "
  23.   "                                                                \0";
  24.  
  25. char * l1 = ¯o_buffer[   0 ];
  26. char * l2 = ¯o_buffer[  64 ];
  27. char * l3 = ¯o_buffer[ 128 ];
  28. char * l4 = ¯o_buffer[ 192 ];
  29.  
  30. int macro_help( char *p, int x, int y, int len );  /* forward */
  31.  
  32. DEFINE_FIELDS( mstring )
  33.     FIELD( l1, TX_MASK, XCRD, YCRD+0, 64, VNOP, cgood, macro_help )
  34.     FIELD( l2, TX_MASK, XCRD, YCRD+1, 64, VNOP, cgood, macro_help )
  35.     FIELD( l3, TX_MASK, XCRD, YCRD+2, 64, VNOP, cgood, macro_help )
  36.     FIELD( l4, TX_MASK, XCRD, YCRD+3, 64, VNOP, cgood, macro_help )
  37. END_FIELDS
  38.  
  39.  
  40. int macro_help( char *p, int x, int y, int len )
  41. {
  42.     char far *fp;
  43.     union REGS xx;
  44.     char **q;
  45.     static char *help[] = {
  46. "^1Record Selection Macros^0 evaluate to TRUE or FALSE and may be nested.",
  47. "",
  48. "^1(OP N S)^0  where  ^1OP^0 is ^1=^0, ^1>^0, ^1>=^0, ^1<^0, ^1<=^0, or ^1?^0, where ? means CONTAINS",
  49. "                  ^1N^0 is the contents of field N, where N = 1, 2, 3, ...",
  50. "                  ^1S^0 is a string (must not contain parentheses)",
  51. "",
  52. "^1(^^ x)^0      means  ^1NOT x^0,     where x is TRUE or FALSE or a macro",
  53. "^1(& x1 x2)^0  means  ^1x1 AND x2^0, where x1, x2 are like x",
  54. "^1(| x1 x2)^0  means  ^1x1 OR x2^0",
  55. "",
  56. "E.g.,  ^1(& (? 1 Smith) (^^ (= 8 50010) ) )^0",
  57. "       selects Last Names containing \"Smith\" where Zipcode is not 50010",
  58. "",
  59. "^2Press spacebar to resume editing macro^0",
  60. NULL
  61.     };
  62.  
  63.     if ( *p == ' ' )  /* help request signal */
  64.     {
  65.         fp = savescreen(&xx);
  66.         normal_video();
  67.         hidecursor();
  68.         windowbox( 0, 0, 79, YCRD-3 );
  69.  
  70.         for ( q = help; *q != NULL; q++ )
  71.         {
  72.             wputs( *q );
  73.             wink('\n');
  74.         }
  75.         defcursor();
  76.         setsynch(1);
  77.         while ( keyin(screenwait) != SPC )
  78.             ;
  79.         restorescreen(fp,&xx);
  80.         return (0);
  81.     }
  82.     return (1);  /* same as TEXT, otherwise; i.e., anything is ok */
  83. }
  84.  
  85.  
  86.  
  87. int record_criterion_met( void )
  88. {
  89.     char *p, *q;
  90.     int n;
  91.  
  92.     p = malloc( MACROSIZE );
  93.     if ( p == (char *) NULL )
  94.         bomb("out of memory");
  95.  
  96.     memset( p, 0, MACROSIZE );
  97.     q = strdup( macro_buffer );
  98.     strip_blanks( q );
  99.     strcpy( p, q );
  100.     free( q );
  101.  
  102.     n = evaluate_macro( p );
  103.     free( p );
  104.  
  105.     return (n);
  106. }
  107.  
  108.  
  109. int selected( void )
  110. {
  111.     if ( select_flag == SAVE_FORM )  /* there is a valid select macro */
  112.     {
  113.         return ( record_criterion_met() );
  114.     }
  115.     /* else no select macro, so the record should always be selected */
  116.     return (1);
  117. }
  118.  
  119.  
  120. static int valid_macro( void )
  121. {
  122.     char *p;
  123.     for ( p = macro_buffer; *p == SPC; p++ )
  124.     ;
  125.     if ( *p != '(' )
  126.     {
  127.         macro_help( " ",0,0,0 );
  128.         return (0);
  129.     }
  130.     /* else macro correctly leads off with opening parenthesis;
  131.        all other syntax errors are trapped by the criterion test
  132.        */
  133.     return ( (record_criterion_met() == -1) ? 0 : 1 );
  134. }
  135.  
  136.  
  137.  
  138. static void swap_menus( void )
  139. {
  140.     static char *macro_actions[] = {
  141.         "Continue editing macro",
  142.         "Accept macro and proceed",
  143.         "Discard macro and return"
  144.     };
  145.     int i;
  146.     char *p;
  147.  
  148.     for ( i = 0; i < 3; i++ )
  149.     {
  150.         p = Fafnir_form_exit_actions[i];
  151.         Fafnir_form_exit_actions[i] = macro_actions[i];
  152.         macro_actions[i] = p;
  153.     }
  154. }
  155.  
  156.  
  157.  
  158. int choose_records( void )
  159. {
  160.     char far *p;
  161.     union REGS x;
  162.     char *temp;
  163.  
  164.     temp = strdup( macro_buffer );  /* save previous macro */
  165.  
  166.     p = savescreen(&x);
  167.     put_screen();
  168.     normal_video();
  169.     windowbox( XCRD, YCRD, XCRD-1+64, YCRD-1+4 );
  170.     fullscreen();
  171.     gotoxy( XCRD+1, YCRD-1 );
  172.     wputs( "╡^2 Enter Record Selection Macro ^0 - ^1F1^0 help, ^1Esc^0 done ╞" );
  173.  
  174.     select_flag = SKIP_FORM;
  175.  
  176.     swap_menus();
  177.     do
  178.     {
  179.         select_flag = _onepageform( NULL, mstring, 4 );
  180.     }
  181.     while ( select_flag == SAVE_FORM && !valid_macro() );
  182.     swap_menus();
  183.  
  184.     restorescreen(p,&x);
  185.  
  186.     if ( select_flag == SAVE_FORM )
  187.     {
  188.         free( temp );
  189.         return (1);
  190.     }
  191.     else /* discard edited macro and quit */
  192.     {
  193.         memcpy( macro_buffer, temp, 256 ); /* restore previous macro */
  194.         free( temp );
  195.         return (0);
  196.     }
  197. }
  198.  
  199.